package com.sigmatrix.h5.aop;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.config.client.ConfigClientProperties;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONObject;
import com.sigmatrix.h5.exception.MessageException;
import com.sigmatrix.h5.utils.CommonUtils;
import com.sigmatrix.h5.utils.Constants;
import com.sigmatrix.h5.web.Result;

import feign.FeignException;


/**
 * 
 *@ClassName: ExceptionHandler
 *@Description: controller 全局异常处理
 *@author MH
 *@date 2017年10月11日 下午3:08:58
 */
@ControllerAdvice
public class GlobalExceptionHandler {

	private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
	
//	private boolean debug = false;
//	
//	@Autowired(required=false)
//	GlobalExceptionHandler(ConfigClientProperties config){
//		if(config != null){
//			if("stable".equals(config.getProfile()) || "dev".equals(config.getProfile())){
//				debug = true;
//			}
//		}
//	}
	
	/**
	 * 
	 *@Title: messageException
	 *@Description: 自定义异常不打印
	 *@return Result
	 *@author MH
	 *@date 2017年10月11日 下午4:13:47
	 *@param e
	 *@return
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@ExceptionHandler({MessageException.class})
	@ResponseBody
	public Result messageException(MessageException e){
		String msg = e.getMessage();
		if(StringUtils.isBlank(msg))msg = "操作失败";
		logger.error(msg,e);
		String status = Constants.DATA_FAILURE;
		if(CommonUtils.isNotEmpty(e.getStatus())){
			status = e.getStatus();
		}
		if(CommonUtils.isNotEmpty(e.getData())){
			return new Result(status, msg, e.getData());
		}
		return Result.error(status,msg);
	}
	/**
	 * 
	 *@Title: feignException
	 *@Description: 处理微服务异常
	 *	status 404 reading UserClient#findInfo(String); content:\n{\"code\":10150,\"message\":\"该用户不存在\"}
	 *@return Result
	 *@author MH
	 *@date 2017年10月11日 下午4:13:30
	 *@param e
	 *@return
	 */
	@ExceptionHandler({FeignException.class})
	@ResponseBody
	public <T> Result<T> feignException(FeignException e){
		String msg = e.getMessage();
		if(StringUtils.isBlank(msg))return Result.error("操作失败");
		try{
			String[] array = msg.split("content:\n");
			if(CommonUtils.isNotEmpty(array) && array.length >1){
				JSONObject json = JSONObject.parseObject(array[array.length-1]);
				msg = json.getString("message");
			}
		}catch(Exception e1){
			e.addSuppressed(e1);
		}
		logger.error(msg,e);
		return Result.error(msg);
	}
	
	/**
	 * 
	 *@Title: handleException
	 *@Description: 未捕获的异常
	 *@return Result
	 *@author MH
	 *@date 2017年10月11日 下午4:14:04
	 *@param e
	 *@return
	 */
	@ExceptionHandler({Exception.class})
	@ResponseBody
	public <T> Result<T> handleException(Exception e){
		String msg = e.getMessage();
		if(StringUtils.isBlank(msg))msg = "操作失败";
		
		logger.error(msg,e);
		return Result.error(msg);
	}
	
}
